package br.edu.ufcg.unknown.semantico.arvore;

import br.edu.ufcg.unknown.lexico.Token;

public class GeradorDeArvores {

	private Nodo nodoRaiz;

	private Nodo ultimoOperador;

	private Nodo ultimoNodoTerminal;

	public void addNodo(Nodo nodo) {
		// Nodo nodo = new Nodo()
		Token tk = null;
		// tk.ehOperador()

		if (this.nodoRaiz == null) {
			this.nodoRaiz = nodo;
			setUltimo(nodo);
			return;
		}
		
		if((!nodo.getTipo().getToken().ehTerminal() || nodo.getTipo().getToken().ehPalavraReservada()) && ultimoOperador == null && (ultimoNodoTerminal != null)){
			nodo.setFilhoEsquerda(ultimoNodoTerminal);
			setUltimo(nodo);
			this.nodoRaiz = nodo;
			if(nodo.getTipo().getToken().ehPalavraReservada()){
				this.ultimoOperador = nodo;
			}
			return;
		}
		
//		if(nodo.getTipo().getToken().ehTerminal() && (ultimoOperador != null && ultimoOperador.getTipo().getToken().ehOperador())){
		if(nodo.getTipo().getToken().ehTerminal() && (ultimoOperador != null && (ultimoOperador.getTipo().getToken().ehOperador() || ultimoOperador.getTipo().getToken().ehPalavraReservada()))){
			ultimoOperador.setFilhoDireita(nodo);
			setUltimo(nodo);
			return;
		}
		
		if((!nodo.getTipo().getToken().ehTerminal() || nodo.getTipo().getToken().ehPalavraReservada()) && (ultimoOperador != null && ultimoOperador.getTipo().getToken().ehOperador())){
			
			if(nodo.getTipo().getPrecedencia() <= ultimoOperador.getTipo().getPrecedencia()){
				nodo.setFilhoEsquerda(nodoRaiz); // Operador olha a raiz
				this.nodoRaiz = nodo;
				setUltimo(nodo);
			} else {
				Nodo aux = nodoRaiz.getFilhoDireita();
				nodoRaiz.setFilhoDireita(nodo);
				nodo.setFilhoEsquerda(aux);
				//Sera que precisa atualizar o ultimo nodo?
			}
		}

	}

	private void setUltimo(Nodo nodo) {
		if (nodo.getTipo().getToken().ehOperador()) {
			this.ultimoOperador = nodo;
		} else {
			this.ultimoNodoTerminal = nodo;
		}
	}

	public Nodo getRaiz() {
		return this.nodoRaiz;
	}

}
